#include "queue.h"

queue *init_queue(int size)
{
    queue *q = calloc(1, sizeof(queue));
    if(q != NULL)
    {
        q->data = calloc(size, sizeof(int));
        if(q->data == NULL)
        {
            free(q);
            return NULL;
        }
        q->front = 0;
        q->rear  = 0;
        q->size  = size;
    }
    return q;
}

bool en_queue(queue *q, int data)
{
    if(is_full(q))
        return false;
    
    q->data[q->rear] = data;
    q->rear = (q->rear+1)%q->size; // 保证q->rear在 [0 ~ size-1] 之间
    return true;
}

bool out_queue(queue *q, int *pdata)
{
    if(!front_queue(q, pdata))
        return false;

    q->front = (q->front+1)%q->size; // 保证q->front在 [0 ~ size-1] 之间
    return true;
}

bool front_queue(queue *q, int *pdata) // 取队头元素
{
    if(is_empty(q))
        return false;
    
    *pdata = q->data[q->front];
    return true;
}

bool is_full(queue *q)
{
    return (q->rear+1)%q->size == q->front;
}

bool is_empty(queue *q)
{
    return q->front == q->rear;
}

void destroy_init(queue *q) // 将队列恢复初始状态
{
    q->front = q->rear = 0;
}

void destroy(queue *q)
{
    if(q == NULL)
        return;

    free(q->data);
    free(q);
}

void show(queue *q)
{
    if(is_empty(q))
        return;

    for(int i=q->front; i!=q->rear; i=(i+1)%q->size)
    {
        printf("%d\t", q->data[i]);
    }
    printf("\n");
}